import {message} from 'antd';
import type {RequestConfig} from 'umi';
import {history, Link, RunTimeLayoutConfig} from '@umijs/max';
import {userInfoApi} from "@/services/user/UserController";
import {logout} from "@/services/login/LoginController";

// 运行时配置

// 全局初始化数据配置，用于 Layout 用户信息和权限初始化
// 更多信息见文档：https://umijs.org/docs/api/runtime-config#getinitialstate
export async function getInitialState(): Promise<{ name: string }> {
  // 左下角的登录用户这是模拟的权限数据
  const initialData = await userInfoApi();
  return initialData.data as { name: string };
}


/**
 * 布局设置
 */
export const layout: RunTimeLayoutConfig = (initialState) => {
  return {
    // 系统图标
    logo: 'https://img.alicdn.com/tfs/TB1YHEpwUT1gK0jSZFhXXaAtVXa-28-27.svg',
    // 系统名称
    title: process.env.SYSTEM_NAME,
    menu: {
      // 默认开启，如无需菜单国际化可关闭
      locale: false,
    },
    logout: () => {
      // https://umijs.org/docs/max/layout-menu#logout
      logout().then(r => {});
    },
    menuItemRender: (menuItemProps, defaultDom) => {
      // 支持二级菜单显示icon
      return (
            <Link to={menuItemProps.path || '/'}>
              <div style={{ display: 'flex' }}>
              <span style={{ paddingRight: '8px' }}>{menuItemProps.pro_layout_parentKeys
                && menuItemProps.pro_layout_parentKeys.length > 0 &&
                menuItemProps.icon}</span>
              {defaultDom}</div>
            </Link>
      )
    },
  };
};


/**
 * 全局的请求配置
 * @see https://umijs.org/docs/max/request#%E8%BF%90%E8%A1%8C%E6%97%B6%E9%85%8D%E7%BD%AE
 */
export const request: RequestConfig = {
  // 超时 - 毫秒
  timeout: 3000,
  // headers: {
  //   [process.env.TOKEN_NAME]: localStorage.getItem(process.env.TOKEN_LOCAL_STORAGE_NAME) || ''
  // },
  // 使用 requestInterceptors 动态添加 token
  requestInterceptors: [
    (url, options) => {
      const token = localStorage.getItem(process.env.TOKEN_LOCAL_STORAGE_NAME);
      if (token) {
        options.headers = {
          ...options.headers,
          [process.env.TOKEN_NAME]: token,
        };
      }
      return { url, options };
    }
  ],

  // https://umijs.org/docs/max/request#%E8%BF%90%E8%A1%8C%E6%97%B6%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B
  errorConfig: {
    // 统一的错误处理函数
    errorHandler(error: any, opts: any){
      if (opts?.skipErrorHandler) throw error;
      // 我们的 errorThrower 抛出的错误。
      if (error.name === 'BizError') {
        const errorInfo: API.ResultVO<any> | undefined = error.info;
        if (errorInfo) {
          const { message: errorMessage, code, success } = errorInfo;
          switch (code) {
            case 401||1003:
              // 重新登录
              history.replace('/login');
              // notification.open({
              //   description: errorMessage,
              //   message: code,
              // });
              break;
            default:
               // 默认弹出错误信息
              message.error(errorMessage || 'Something went wrong!');
              break;
          }
        }
      } else if (error.response) {
        // Axios 的错误
        // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
        message.error(`Response status:${error.response.status}`);
      } else if (error.request) {
        // 请求已经成功发起，但没有收到响应
        // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例，
        // 而在node.js中是 http.ClientRequest 的实例
        message.error('None response! Please retry.');
      } else {
        // 发送请求时出了点问题
        message.error('Request error, please retry.');
      }
    },

    // 统一的错误抛出函数
    // errorThrower 是利用 responseInterceptors 实现的，它的触发条件是: 当 data.success 为 false 时。
    errorThrower(res: API.ResultVO<any>){
      // 根据后端返回的错误数据抛出自定义错误
      const { success, message, code } = res;
      if (!success) {
        const error: any = new Error(message);
        error.name = 'BizError';
        error.info = { code, message, success };
        throw error;
      }
    }
  },
  // 为 request 方法添加响应阶段的拦截器。
  responseInterceptors: []
};


// 不需要登录就可以访问的路径列表
const publicPaths = ['/login', '/register', '/forgot-password'];
function isPublicPathCaseInsensitive(pathname:string) {
  return publicPaths.some(path => pathname.toLowerCase().endsWith(path.toLowerCase()));
}
/**
 * 全局拦截器，登录验证
 */
export function onRouteChange({ location, routes, action }: any) {

  const { pathname } = location;
  // console.log("pathname："+pathname)
  // 或者从其他地方获取token
  const token = localStorage.getItem(process.env.TOKEN_LOCAL_STORAGE_NAME);
  if (!token && !isPublicPathCaseInsensitive(pathname)) {
    console.log("需要登录")
    history.replace('/login');
  }
}


window.addEventListener('unhandledrejection', (event) => {
  console.error('Unhandled promise rejection:', event.reason);
  // 可以进行一些错误处理逻辑，比如弹出提示等
  message.error('An unexpected error occurred.');
});